package org.batatasframework.support.factory;

import org.batatasframework.support.database.metadatas.TableMetadata;
import org.batatasframework.support.definition.TableDefinition;
import org.batatasframework.support.definition.TableDefinitionBuilder;

public interface TableDefinitionRegistry {

	void registerTableDefinition(String name, TableDefinition tableDefinition) throws Exception;
	TableDefinition getTableDefinition(String name);

	/**
	 * <pre>
	 * 创建一个上下文，创建后这个上下文是游离状态的，这个时候可以在代码级的进行一些字段的指定
	 * 创建完成后，可以注册到管理器，这样下次使用同名来进行引用的时候，如果存在，则不再创建新的上下文
	 * 
	 * 也可以不注册，不注册的话使用同一个名字会创建不同的上下文对象
	 * 
	 * <font color="red">调用本方法，一定会重新创建一个{@link TableDefinition} 对象</font>
	 * 
	 * 一个上下文被创建后需要被保存起来，并且以后在使用的时候是确定的，也就是说只需要创建一次。
	 * 在请求里可以给上下文指定要查询哪些定义，传递过来了哪些查询条件，如何分组等信息；在执行的时候，由上下文创建一个
	 * 执行的处理器来处理；整个过程定义完之后，都是自动完成的。
	 * 
	 * 这里是手动定义上下文的情况；上下文还可以是通过配置文件定义好的。直接通过"key"来访问取得，参考：{@link #getSearchableContext(String)}
	 * 手动创建的上下文也可以注册回去，这样在其它地方就可以通过注册的"key"来引用；但无法保存注册和引用的先后顺序。
	 * 
	 * 需要安全关闭
	 * </pre>
	 */
	TableDefinitionBuilder buildSearchableContextBuilder(String schemaName, String catalogName, String tableName) throws Exception;
	
	/** 注意，子类里需要对{@link TableDefinitionBuilder}对象进行安全关闭 */
	TableDefinitionBuilder buildSearchableContextBuilder(TableMetadata sourceTableMetadata) throws Exception;

}
